package main

import (
	"bufio"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

func main() {
	fmt.Println("=== gitmv - 批量重命名文件的Git工具 ===")
	fmt.Println()

	// 获取用户输入
	dirPath := getDirectoryPath()
	oldPattern := getOldPattern()
	newPattern := getNewPattern()
	recursive := getRecursiveOption()
	dryRun := getDryRunOption()

	// 显示确认信息
	fmt.Println()
	fmt.Println("=== 操作确认 ===")
	fmt.Printf("处理目录: %s\n", dirPath)
	fmt.Printf("替换模式: %s -> %s\n", oldPattern, newPattern)
	fmt.Printf("递归处理: %v\n", recursive)
	fmt.Printf("预览模式: %v\n", dryRun)
	fmt.Println()

	// 确认是否继续
	if !confirmOperation() {
		fmt.Println("操作已取消")
		return
	}

	// 检查目录是否存在
	if _, err := os.Stat(dirPath); os.IsNotExist(err) {
		fmt.Printf("错误: 目录 %s 不存在\n", dirPath)
		return
	}

	fmt.Println("---")

	// 执行重命名操作
	if err := renameFiles(dirPath, oldPattern, newPattern, recursive, dryRun); err != nil {
		fmt.Printf("处理过程中出错: %v\n", err)
		return
	}

	fmt.Println("批量重命名完成!")
}

func getDirectoryPath() string {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入要处理的目录路径 (直接按回车使用当前目录): ")
	input, _ := reader.ReadString('\n')
	input = strings.TrimSpace(input)

	if input == "" {
		currentDir, _ := os.Getwd()
		return currentDir
	}

	return input
}

func getOldPattern() string {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入要替换的旧字符串模式: ")
	input, _ := reader.ReadString('\n')
	return strings.TrimSpace(input)
}

func getNewPattern() string {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入新的字符串模式: ")
	input, _ := reader.ReadString('\n')
	return strings.TrimSpace(input)
}

func getRecursiveOption() bool {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("是否递归处理子目录? (y/N): ")
	input, _ := reader.ReadString('\n')
	input = strings.ToLower(strings.TrimSpace(input))

	return input == "y" || input == "yes"
}

func getDryRunOption() bool {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("是否仅预览操作而不实际执行? (y/N): ")
	input, _ := reader.ReadString('\n')
	input = strings.ToLower(strings.TrimSpace(input))

	return input == "y" || input == "yes"
}

func confirmOperation() bool {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("确认执行以上操作? (Y/n): ")
	input, _ := reader.ReadString('\n')
	input = strings.ToLower(strings.TrimSpace(input))

	return input == "" || input == "y" || input == "yes"
}

func renameFiles(dirPath, oldPattern, newPattern string, recursive, dryRun bool) error {
	// 遍历目录
	return filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 如果是目录且不递归，则跳过
		if info.IsDir() {
			if !recursive && path != dirPath {
				return filepath.SkipDir
			}
			return nil
		}

		// 获取文件名
		fileName := info.Name()

		// 检查文件名是否包含要替换的模式
		if strings.Contains(fileName, oldPattern) {
			// 创建新文件名
			newFileName := strings.ReplaceAll(fileName, oldPattern, newPattern)

			// 构建完整路径
			oldPath := path
			newPath := filepath.Join(filepath.Dir(path), newFileName)

			if dryRun {
				// 预览模式：只显示将要执行的操作
				fmt.Printf("[预览] 将重命名: %s -> %s\n", fileName, newFileName)
			} else {
				// 实际执行git mv命令
				cmd := exec.Command("git", "mv", oldPath, newPath)
				cmd.Stdout = os.Stdout
				cmd.Stderr = os.Stderr

				fmt.Printf("正在重命名: %s -> %s\n", fileName, newFileName)

				if err := cmd.Run(); err != nil {
					fmt.Printf("错误: 重命名 %s 失败: %v\n", fileName, err)
					return err
				}

				fmt.Printf("成功重命名: %s -> %s\n", fileName, newFileName)
			}
		}

		return nil
	})
}
